package org.jiuling.kuaidi100.dto;

import org.jiuling.basics.validation.ObjectVerify;
import org.jiuling.basics.validation.StringVerify;
import org.jiuling.kuaidi100.exception.Kuaidi100RuntimeException;

/**
 * 订阅快递信息推送数据传输对象
 * @author 紫灵
 * @date 2024年02月29日 21时19分49秒
 */
public class SubscribeExpressInfoPushDto {

    /** 返回的数据格式，json(默认) ,xml */
    private String schema;
    /** 参数 */
    private ParamDto param;

    public String getSchema() {
        return schema;
    }

    public ParamDto getParam() {
        return param;
    }


    /**
     * 建造者
     * @return 建造者
     */
    public static Builder builder(){
        return new Builder();
    }

    /**
     * 建造者
     */
    public static class Builder{

        /** 订阅快递信息推送数据传输对象 */
        private final SubscribeExpressInfoPushDto subscribeExpressInfoPushDto;

        public Builder() {
            this.subscribeExpressInfoPushDto = new SubscribeExpressInfoPushDto();
        }

        public Builder addSchema(String schema) {
            subscribeExpressInfoPushDto.schema = schema;
            return this;
        }

        public Builder addParam(ParamDto param) {
            subscribeExpressInfoPushDto.param = param;
            return this;
        }


        /**
         * 构建
         * @return 订阅快递信息推送数据传输对象
         */
        public SubscribeExpressInfoPushDto build(){
            if(ObjectVerify.isNull(subscribeExpressInfoPushDto.param)){
                throw new Kuaidi100RuntimeException("参数不能为空！");
            }
            return subscribeExpressInfoPushDto;
        }


    }

    /**
     * 参数数据传输对象
     */
    public static class ParamDto{

        /** ems	订阅的快递公司的编码，一律用小写字母，下载编码表格 */
        private String company;
        /** 订阅的快递单号， 单号的最小长度6个字符，最大长度32个字符 */
        private String number;
        /** 出发地城市，省-市-区，非必填，填了有助于提升签收状态的判断的准确率，请尽量提供 */
        private String from;
        /** 目的地城市，省-市-区，非必填，填了有助于提升签收状态的判断的准确率，且到达目的地后会加大监控频率，请尽量提供 */
        private String to;
        /** 授权码，请申请企业版获取 */
        private String key;

        /** 附加参数 */
        private ParametersDto parameters;

        public String getCompany() {
            return company;
        }

        public String getNumber() {
            return number;
        }

        public String getFrom() {
            return from;
        }

        public String getTo() {
            return to;
        }

        public String getKey() {
            return key;
        }

        public ParametersDto getParameters() {
            return parameters;
        }

        /**
         * 建造者
         * @return 建造者
         */
        public static Builder builder(){
            return new Builder();
        }

        /**
         * 建造者
         */
        public static class Builder{

            /** 参数数据传输对象 */
            private final ParamDto paramDto;

            public Builder() {
                this.paramDto = new ParamDto();
            }

            public Builder addCompany(String company) {
                paramDto.company = company;
                return this;
            }

            public Builder addNumber(String number) {
                paramDto.number = number;
                return this;
            }

            public Builder addFrom(String from) {
                paramDto.from = from;
                return this;
            }

            public Builder addTo(String to) {
                paramDto.to = to;
                return this;
            }

            public Builder addKey(String key) {
                paramDto.key = key;
                return this;
            }

            public Builder addParameters(ParametersDto parameters){
                paramDto.parameters = parameters;
                return this;
            }

            public ParamDto build(){
                if(StringVerify.isBlank(paramDto.company)){
                    throw new Kuaidi100RuntimeException("订阅的快递公司的编码不能为空");
                }
                if(StringVerify.isBlank(paramDto.number)){
                    throw new Kuaidi100RuntimeException("订阅的快递单号不能为空！");
                }
                if(StringVerify.isBlank(paramDto.key)){
                    throw new Kuaidi100RuntimeException("授权码不能为空！");
                }
                if(ObjectVerify.isNull(paramDto.parameters)){
                    throw new Kuaidi100RuntimeException("附加参数不能为空！");
                }
                return paramDto;
            }

        }

        /**
         * 附加参数数据传输对象
         */
        public static class ParametersDto{

            /** 回调接口的地址，默认仅支持http，如需兼容https请联系快递100技术人员处理 */
            private String callbackurl;
            /** 签名用随机字符串 */
            private String salt;
            /** 添加此字段表示开通行政区域解析功能。空：关闭（默认），1：开通行政区域解析功能以及物流轨迹增加物流状态名称 4: 开通行政解析功能以及物流轨迹增加物流高级状态名称、状态值并且返回出发、目的及当前城市信息 */
            private String resultv2;
            /** 添加此字段且将此值设为1，则表示开启智能判断单号所属公司的功能，开启后，需确保company字段为空,即只传运单号（number字段），我方收到后会根据单号判断出其所属的快递公司（即company字段）。建议只有在无法知道单号对应的快递公司（即company的值）的情况下才开启此功能。 */
            private String autoCom;
            /** 添加此字段表示开启国际版，开启后，若订阅的单号（即number字段）属于国际单号，会返回出发国与目的国两个国家的跟踪信息，本功能暂时只支持邮政体系（国际类的邮政小包、EMS）内的快递公司，若单号我方识别为非国际单，即使添加本字段，也不会返回destResult元素组 */
            private String interCom;
            /** 出发国家编码 */
            private String departureCountry;
            /** 出发的快递公司的编码 */
            private String departureCom;
            /** 目的国家编码 */
            private String destinationCountry;
            /** 目的的快递公司的编码 */
            private String destinationCom;
            /** 收、寄件人的电话号码（手机和固定电话均可，只能填写一个，顺丰速运、顺丰快运必填，其他快递公司选填。如座机号码有分机号，分机号无需上传。） */
            private String phone;

            public String getCallbackurl() {
                return callbackurl;
            }

            public String getSalt() {
                return salt;
            }

            public String getResultv2() {
                return resultv2;
            }

            public String getAutoCom() {
                return autoCom;
            }

            public String getInterCom() {
                return interCom;
            }

            public String getDepartureCountry() {
                return departureCountry;
            }

            public String getDepartureCom() {
                return departureCom;
            }

            public String getDestinationCountry() {
                return destinationCountry;
            }

            public String getDestinationCom() {
                return destinationCom;
            }

            public String getPhone() {
                return phone;
            }

            public static Builder builder(){
                return new Builder();
            }

            public static class Builder{

                /**附加参数数据传输对象 */
                private final ParametersDto parametersDto;

                public Builder(){
                    this.parametersDto = new ParametersDto();
                }

                public Builder addCallbackurl(String callbackurl) {
                    parametersDto.callbackurl = callbackurl;
                    return this;
                }

                public Builder addSalt(String salt) {
                    parametersDto.salt = salt;
                    return this;
                }

                public Builder addResultv2(String resultv2) {
                    parametersDto.resultv2 = resultv2;
                    return this;
                }

                public Builder addAutoCom(String autoCom) {
                    parametersDto.autoCom = autoCom;
                    return this;
                }

                public Builder addInterCom(String interCom) {
                    parametersDto.interCom = interCom;
                    return this;
                }

                public Builder addDepartureCountry(String departureCountry) {
                    parametersDto.departureCountry = departureCountry;
                    return this;
                }

                public Builder addDepartureCom(String departureCom) {
                    parametersDto.departureCom = departureCom;
                    return this;
                }

                public Builder addDestinationCountry(String destinationCountry) {
                    parametersDto.destinationCountry = destinationCountry;
                    return this;
                }

                public Builder addDestinationCom(String destinationCom) {
                    parametersDto.destinationCom = destinationCom;
                    return this;
                }

                public Builder addPhone(String phone) {
                    parametersDto.phone = phone;
                    return this;
                }

                /**
                 * 构建
                 * @return 附加参数数据传输对象
                 */
                public ParametersDto build(){
                    if(StringVerify.isBlank(parametersDto.callbackurl)){
                        throw new Kuaidi100RuntimeException("回调接口的地址不能为空！");
                    }
                    return parametersDto;
                }


            }


        }

    }



}
